package com.jason.www.pubsub.core;


import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;

/**
 * @author ybd
 * @date 17-10-30.
 */
public interface BossApplicationListener<E extends ApplicationEvent> extends ApplicationListener<E>, ListenerProcessor<E> {

	/**
	 * 重载了ApplicationListener.onApplicationEvent(E e),在这基础上添加了异步
	 * @param event 事件源
	 */
	@Async
	@Override
	default void onApplicationEvent(E event) {
		getListenerTemplate().setEvent(event)
							 .onListenProcess(this)
							 .process();
	}

	/**
	 * 提供一个ListenerTemplate<E>
	 * @return ListenerTemplate
	 */
	default ListenerTemplate<E> getListenerTemplate() {
		return new ListenerTemplate<E>().setListener(this);
	}

}
